1 Producción de Azúcar

Información del conjunto de datos: azúcar se ha disuelto en agua sin amortiguar y la solución se midió espectrofluorométricamente en una cubeta de 10 \(\times\) 10 \(mm^2\). Los datos en bruto se midieron con un fluorómetro. Para cada muestra, los espectros de emisión se midieron en intervalos de \(0.5\) nm en siete ondas de excitación.

Es decir, tenemos una muestra de tamaño 265, en 571 puntos para cada una de las 7 ondas de longitudes de excitación.

En nuestro caso, decidimos tomar el nivel de excitación correspondiente al nivel de onda 340. Para entender un poco mejor los datos, visualicemos la información sin haberla tratado (i.e. en bruto).

Después de visualizar las funciones (sin suavizar) consideramos como más acertado usar una base de funciones B-Spline para llevar a cabo el suavizado, pues en los datos no se perciben comportamientos cíclicos (o sinusoidales). Como apunte adicional, mencionamos que para llevar a cabo el ajuste nos bastó con usar polinomios de grado 3 (orden 4) y para la parte que presentaba un apuntamiento muy alto usamos más breakpoints.

A continuación podemos ver las versiones suavizadas de la muestra en cuestión.

Para contrastar las estimaciones, vamos a superponer los datos sin tratar, junto con las respectivas curvas suavizadas.

1.1 Función de media

La función de media \(\overline{x(t)}\) se presenta a continuación

1.2 Función de media recortada al 10%

Veremos la media recortada, que corresponde al cálculo de la media despúes de haber omitida una cantidad de observaciones (en este, el 10% de las observaciones menos centrales). Vemos que las funciones menos centrales, parecen mostrar un comportamiento, más apuntados en alguna parte o la parte central en lugar de ser decreciente crece.

1.3 Función de varianza

Se calculó usando todos los datos.

1.4 Función de covarianza

Mostramos la superficie obtenida. Con la función persp obtenemos una figura no muy agradable. Sin embargo, usaremos la función plot_ly que graficará la superficie en una página web y tomamos capturas de pantalla.

Aprovechamos para visualizar las funciones de varianza y covarianza, y la matriz de correlaciones.

Covarianza

Covarianza

Correlación

Correlación

Otra forma de visualizarlo sería usando mapas de calor. A continucación

1.5 La función de mediana

Corresponde a la estimación con la mayor densidad de todas las estimaciones.

1.6 Funciones cuantiles 90% y 95%

Cuando tomamos el \(p\%\) de bandas más profundas y construimos la banda, fuera de la banda queda \((1-p)\%\) y por ende \(\left(\frac{1-p}{2}\right)\%\) en los extremos. Luego, la banda máxima cubre \(\left(p + \frac{1-p}{2}\right)\&\). Es decir, tenemos un cuantil que cubre:

\(q = \frac{1+p}{2} \implies p = 2q - 1\)

Es decir, que si especificamos el cuantil \(q\), podremos saber cual es la banda \(p\) a elegir.

Entonces tenemos:

  • Al cuantil \(q_{90}\) le corresponde la región \(p = 0.8\)
  • Al cuantil \(q_{95}\) le corresponde la región \(p = 0.9\)

En el mismo gráfico presentamos las funciones de los cuantiles solicitados.

1.7 Región central 0.75

1.8 Boxplot funcional y outliers

Los números que aparecen en la leyenda son los identificadores de las funciones \(\widehat{x}\) consideradas como atípicas. En este caso, podemos considerar que se tratan de outliers parciales. Las observaciones 131, 71 y 10, tienen una región (intervalo 350-450 aproximadamente) en la que las curvas o bien decrecen de forma muy suave o bien se comportan de forma creciente (contrario al boxplot que tenemos de fondo).

1.9 Boxplot funcional ajustado y outliers

  1. Debido a las dificultades que encontramos para implementar la estimación de la matriz de varianzas y covarianzas robusta usamos dos formas. Primero con el paquete roahd.

La tasa positiva de outliers que usamos fue de 99.7%.

Con lo que obtuvimos un valor para el hiperparámetro F de 1.077.

Vemos que ajustando el factor, obtenemos los 3 outliers de antes (outliers parciales). De igual forma, los datos 13, 15 y 268 también resultan ser outliers parciales, pues vemos que en ciertas regiones se comportan de forma distinta al resto de funciones. Finalmente se obtienen los outliers correspondientes a los datos 14, 16, 17 y 38. Estos últimos es más difícil de justificar con una simple visualización, pues en las partes en donde salen del boxplot son muy pocas y pequeñas.

solo obtenemos 3 datos atípicos. Justamente los 3 datos que habíamos catalogados como outliers parciales (y que en cierta medida, era más sencillo justificar porqué eran outliers).

  1. Como alternativa, proponemos basarnos en técnicas de remuestreo para estimar el boxplot sin usar los que parecen ser datos atípicos (es decir, sin considerar los 5 datos que considerabamos como outliers) y definir el valor del hiperparámetro F.

Los gráficos nos ayudan a ver el efecto de haber cambiado el factor \(F\) de 1.5 a 1.74 y vemos que la proporción de datos catalogados como atípicos cuando no lo son pasa de un 5% a un 2%.

Mostramos a continuación el boxplot resultante al modificar el factor F.

Aunque parece más acertada la salida de la función roahd::fbplot usando el parámetro adjust.

1.10 La función mediana multivariada

El nivel de excitación que habíamos elegido inicalmente fue de 340. Para llevar a cabo los procedimientos multivariados, tomamos otro nivel de onda correspondiente al valor 325.

Es decir que tenemos un conjunto de datos funcionales bivariado. Veamos rápidamente el nuevo conjunto de datos y los suavizamoentos correspondientes.

El gráfico respectivo de la mediana multivariada:

1.11 Outliers multivariados

Mostramos los identificadores de los individuos que aparecen como atípicos.

Como vemos, los individuos 10, 71 y 131 aparecen nuevamente como datos atípicos (aún considerando los datos multivariados). Sin embargo nos llamó la atención que el individuo 15 no fuese un outlier a nivel multivariado pero los individuos 14 y 16 si.

2 Artículo: Comparative study of different B-spline approaches for functional data

Referencia del artículo: Aguilera, A. M., & Aguilera-Morillo, M. C. (2013). Comparative study of different B-spline approaches for functional data. Mathematical and Computer Modelling, 58(7-8), 1568-1579.

Siguiendo la contrucción del artículo de Aguilera, se generan los datos simulados, generando 100 curvas de un proceso estocástico de media cero que sigue que cada curva X, posee un comportamiento dado por \(X (t)=R cos (2\pi t+ \theta)\), en el cual \(R\) y \(\theta\) provienen de una distribución i.i.d Rayleigh(\(\sigma\)), con \(\sigma=0.3\) y Uniforme \([0,2\pi]\), respectivamente.

Se realiza una muestra de observaciones con 51 nodos (knots) igualmente espaciados en el intervalo \(T=[0,1]\), en el cual los errores de cada curva se comportan de manera \(Normal(0,\sigma²)\) con \(\sigma²=0.07\)

Regression Splines La primera curva a partir de un \(R\) y \(\theta\) aleatorio se construye, siguiendo las dos bases de nuestro interés. Tanto Fourier como B-Splines

se crea la base para la construcción de regresiones splines y smoothing splines, generadas a partir de bases B-Splines y Bases de Fourier, respectivamente, con 51 nodos en el intervalo \(T=[0,1]\)

Smoothing Splines

Para las gráficas que genera el autor, se generan las 100 curvas a partir de la simulación, tal como se menciona en un inicio, y se grafican las funciones

Se grafica la función rela, la función simulada con errores normales, y con las bases que definimos en el planteamiento de la simulación (5, 15 y 25). Ajustando también Regresión Spline y Smoothing Spline con un \(\lambda=0.01\)

Se grafica el boxplot correspondiente a los valores GCV con cada uno de los valores de número de base

Se grafica la función media para las 100 cruvas generadas para cada una de las elecciones de número de bases (5,15 y 25). También se presenta un boxplot de MSE para ambos métodos de ajuste (Smoothing splines y Reggresion Splines)

2.1 graficar con 5 bases

2.2 graficar con 15 bases

2.3 Graficar con 25 bases

LS0tCnRpdGxlOiBUYWxsZXIgXCMgMgphdXRob3I6IAogICAgLSBKdWFuIFNlYmFzdGlhbiBHw7NtZXogRC4KICAgIC0gRGFuaWVsIEZlbGlwZSBDZW5kYWxlcyBHLgpvdXRwdXQ6IAogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZGVwdGg6IDIKICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBDb25maWd1cmFjaW9uZXMgZ2xvYmFsZXMsIGVjaG8gPSBGQUxTRX0KIyBDb25maWd1cmFjaW9uZXMgZ2VuZXJhbGVzCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9ICdoaWRlJykKYGBgCgpgYGB7cn0KY2FyZ2FfZV9pbnN0YWxhIDwtIGZ1bmN0aW9uKHgpewogICAgbm9faW5zdGFsYWRvcyA8LSAhKHggJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssIDFdKQogICAgaWYoYW55KG5vX2luc3RhbGFkb3MpKXsKICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHhbbm9faW5zdGFsYWRvc10pCiAgICB9CiAgICBzYXBwbHkoeCwgbGlicmFyeSwgbG9naWNhbC5yZXR1cm4gPSBUUlVFLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCn0KCnBhcXVldGVzIDwtIGMoJ2ZkYScsICdmZGEudXNjJywgJ1ZHQU0nLCAnZ2dwbG90MicsICdwbG90bHknLCdwYXRjaHdvcmsnKQpjYXJnYV9lX2luc3RhbGEocGFxdWV0ZXMpCmBgYAoKIyBQcm9kdWNjacOzbiBkZSBBesO6Y2FyIHsudGFic2V0fQoKKipJbmZvcm1hY2nDs24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zOioqIGF6w7pjYXIgc2UgaGEgZGlzdWVsdG8gZW4gYWd1YSBzaW4gYW1vcnRpZ3VhciB5IGxhIHNvbHVjacOzbiBzZSBtaWRpw7MgZXNwZWN0cm9mbHVvcm9tw6l0cmljYW1lbnRlIGVuIHVuYSBjdWJldGEgZGUgMTAgJFx0aW1lcyQgMTAgJG1tXjIkLiBMb3MgZGF0b3MgZW4gYnJ1dG8gc2UgbWlkaWVyb24gY29uIHVuIGZsdW9yw7NtZXRyby4gUGFyYSBjYWRhIG11ZXN0cmEsIGxvcyBlc3BlY3Ryb3MgZGUgZW1pc2nDs24gc2UgbWlkaWVyb24gZW4gaW50ZXJ2YWxvcyBkZSAkMC41JCBubSBlbiBzaWV0ZSBvbmRhcyBkZSBleGNpdGFjacOzbi4KCkVzIGRlY2lyLCB0ZW5lbW9zIHVuYSBtdWVzdHJhIGRlIHRhbWHDsW8gMjY1LCBlbiA1NzEgcHVudG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIDcgb25kYXMgZGUgbG9uZ2l0dWRlcyBkZSBleGNpdGFjacOzbi4KCkVuIG51ZXN0cm8gY2FzbywgZGVjaWRpbW9zIHRvbWFyIGVsIG5pdmVsIGRlIGV4Y2l0YWNpw7NuIGNvcnJlc3BvbmRpZW50ZSBhbCBuaXZlbCBkZSBvbmRhIDM0MC4gUGFyYSBlbnRlbmRlciB1biBwb2NvIG1lam9yIGxvcyBkYXRvcywgdmlzdWFsaWNlbW9zIGxhIGluZm9ybWFjacOzbiBzaW4gaGFiZXJsYSB0cmF0YWRvIChpLmUuIGVuIGJydXRvKS4KCmBgYHtyIExlY3R1cmEgZGUgZGF0b3MgeSBDb25maWcuIGluaWNpYWx9CiMgTGVjdHVyYSBkZSBkYXRvcwpydXRhIDwtICcuL0RhdG9zL2RhdG9zLnR4dCcKZGF0b3MxIDwtIHJlYWQudGFibGUoY29sQ2xhc3NlcyA9IHJlcChjKCdOVUxMJywgJ251bWVyaWMnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg2LCAxKSo1NzEpLCBmaWxlID0gcnV0YSkKIyBHcsOhZmljb3MKdF9yYW5nbyA8LSBzZXEoMjc1LCA1NjAsIGJ5ID0gMC41KQptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ0RhdG9zIG9ic2VydmFkb3MnLAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnKQpgYGAKCkRlc3B1w6lzIGRlIHZpc3VhbGl6YXIgbGFzIGZ1bmNpb25lcyAoc2luIHN1YXZpemFyKSBjb25zaWRlcmFtb3MgY29tbyBtw6FzIGFjZXJ0YWRvIHVzYXIgdW5hIGJhc2UgZGUgZnVuY2lvbmVzICpCLVNwbGluZSogcGFyYSBsbGV2YXIgYSBjYWJvIGVsIHN1YXZpemFkbywgcHVlcyBlbiBsb3MgZGF0b3Mgbm8gc2UgcGVyY2liZW4gY29tcG9ydGFtaWVudG9zIGPDrWNsaWNvcyAobyBzaW51c29pZGFsZXMpLiBDb21vIGFwdW50ZSBhZGljaW9uYWwsIG1lbmNpb25hbW9zIHF1ZSBwYXJhIGxsZXZhciBhIGNhYm8gZWwgYWp1c3RlIG5vcyBiYXN0w7MgY29uIHVzYXIgcG9saW5vbWlvcyBkZSBncmFkbyAzIChvcmRlbiA0KSB5IHBhcmEgbGEgcGFydGUgcXVlIHByZXNlbnRhYmEgdW4gYXB1bnRhbWllbnRvIG11eSBhbHRvIHVzYW1vcyBtw6FzICpicmVha3BvaW50cyouCgpgYGB7ciBDcmVhY2nDs24gZGUgYmFzZX0KIyBCYXNlIHF1ZSBzZSB2YSBhIHVzYXIKYmsgPC0gYygyNzUsIDI4NSwgMzAwLCAzMjAsIDM2MC41LCAzODksIDQzMCwgNDcwLCA1MjAsIDU2MCkKYmFzZV9ic3AgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYnJlYWtzID0gYmssIG5vcmRlciA9IDQpCmBgYAoKQSBjb250aW51YWNpw7NuIHBvZGVtb3MgdmVyIGxhcyB2ZXJzaW9uZXMgc3Vhdml6YWRhcyBkZSBsYSBtdWVzdHJhIGVuIGN1ZXN0acOzbi4KCmBgYHtyfQphanVzdGUgPC0gRGF0YTJmZCh5ID0gYXMubWF0cml4KHQoZGF0b3MxKSksIAogICAgICAgICAgICAgICAgICBiYXNpc29iaiA9IGJhc2VfYnNwLCAKICAgICAgICAgICAgICAgICAgYXJndmFscyA9IHRfcmFuZ28pCnBsb3QoYWp1c3RlLCBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ0N1cnZhcyBTdWF2aXphZGFzJywgCiAgICAgeWxhYiA9ICdGbHVvcmVzY2VuY2lhJywgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKQpgYGAKClBhcmEgY29udHJhc3RhciBsYXMgZXN0aW1hY2lvbmVzLCB2YW1vcyBhIHN1cGVycG9uZXIgbG9zIGRhdG9zIHNpbiB0cmF0YXIsIGp1bnRvIGNvbiBsYXMgcmVzcGVjdGl2YXMgY3VydmFzIHN1YXZpemFkYXMuCgpgYGB7cn0KIyBEYXRvcyBlbiBicnV0bwptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4xLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ011ZXN0cmFzIHkgY3VydmFzIHN1YXZpemFkYXMgYXNvY2lhZGFzJywgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsCiAgICAgICAgY29sID0gJ2JsYWNrJykKCiMgUmVzcGVjdGl2YXMgY3VydmFzIHN1YXZpemFkYXMKbGluZXMoYWp1c3RlLCBsd2QgPSAxLCBjb2wgPSAnbWlkbmlnaHRibHVlJywgbHR5ID0gMSkKbGVnZW5kKGxlZ2VuZCA9IGMoJ1NpbiB0cmF0YXInLCAnU3Vhdml6YWRhcycpLCBsd2QgPSAyLCAKICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJ21pZG5pZ2h0Ymx1ZScpLCBwY2ggPSBjKDE5LCBOQSksCiAgICAgICBwdC5jZXggPSAwLjIsIHRleHQuY29sID0gYygnYmxhY2snLCAnbWlkbmlnaHRibHVlJyksCiAgICAgICB4ID0gJ3RvcHJpZ2h0JywgYmcgPSAnZ3JheTgyJywgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgbHR5ID0gYyhOQSwgMSkpCmBgYAoKIyMgRnVuY2nDs24gZGUgbWVkaWEKCkxhIGZ1bmNpw7NuIGRlIG1lZGlhICRcb3ZlcmxpbmV7eCh0KX0kIHNlIHByZXNlbnRhIGEgY29udGludWFjacOzbgoKYGBge3J9CiMgIEV4dHJhZW1vcyBsb3Mgb2JqZXRvcyBhanVzdGFkb3MKYWp1c3RlX2RldGFsbGFkbyA8LSBzbW9vdGguYmFzaXMoYXJndmFscyA9IHRfcmFuZ28sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gdChkYXRvczEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRQYXJvYmogPSBiYXNlX2JzcCkKIyBGdW5jaW9uZXMgYWp1c3RhZGFzCmZfaGF0IDwtIGV2YWwuZmQoZXZhbGFyZyA9IHRfcmFuZ28sIAogICAgICAgICAgICAgICAgIGZkb2JqID0gYWp1c3RlX2RldGFsbGFkbyRmZCkKY29sbmFtZXMoZl9oYXQpIDwtIHBhc3RlMCgndicsIDE6bmNvbChmX2hhdCkpCgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ01lZGlhIHkgZGF0b3Mgb3JpZ2luYWxlcycsIAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnLAogICAgICAgIGNvbCA9ICdncmF5JykKCiMgQWdyZWdhbW9zIGxhIGZ1bmNpw7NuIGRlIG1lZGlhCnlfbWVkaWEgPC0gYXBwbHkoWCA9IGZfaGF0LCBNQVJHSU4gPSAxLCBtZWFuKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWEsIGNvbCA9ICdibGFjaycsIGx3ZCA9IDMpCmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gYygnTWVkaWEnLCAnRGF0b3Mgb3JpZ2luYWxlcycpLAogICAgICAgbHdkID0gYygzLCBOQSksIGNvbCA9IGMoJ2JsYWNrJywgJ2dyYXknKSwgCiAgICAgICBsdHkgPSBjKDEsIE5BKSwgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgcGNoID0gMTksIHB0LmNleCA9IGMoTkEsIDAuMikpCgojIEJveHBsb3QgZnVuY2lvbmFsCmZicGxvdChmaXQgPSBmX2hhdCwgeCA9IHRfcmFuZ28sIHlsaW0gPSBjKC0xMCwgNTAwKSwgCiAgICAgICBtYWluID0gJ0JveHBsb3QgZnVuY2lvbmFsJywgeGxpbSA9IHJhbmdlKHRfcmFuZ28pLAogICAgICAgcGxvdCA9IEZBTFNFKSAtPiBicF9mdW5jaW9uYWwKb3JkZXIoYnBfZnVuY2lvbmFsJGRlcHRoKSAtPiBjZW50cmFsZXMKYGBgCgojIyBGdW5jacOzbiBkZSBtZWRpYSByZWNvcnRhZGEgYWwgMTAlCgpWZXJlbW9zIGxhIG1lZGlhIHJlY29ydGFkYSwgcXVlIGNvcnJlc3BvbmRlIGFsIGPDoWxjdWxvIGRlIGxhIG1lZGlhIGRlc3DDumVzIGRlIGhhYmVyIG9taXRpZGEgdW5hIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgKGVuIGVzdGUsIGVsIDEwJSBkZSBsYXMgb2JzZXJ2YWNpb25lcyAqbWVub3MgY2VudHJhbGVzKikuIFZlbW9zIHF1ZSBsYXMgZnVuY2lvbmVzIG1lbm9zIGNlbnRyYWxlcywgcGFyZWNlbiBtb3N0cmFyIHVuIGNvbXBvcnRhbWllbnRvLCBtw6FzIGFwdW50YWRvcyBlbiBhbGd1bmEgcGFydGUgbyBsYSBwYXJ0ZSBjZW50cmFsIGVuIGx1Z2FyIGRlIHNlciBkZWNyZWNpZW50ZSBjcmVjZS4KCmBgYHtyfQojIERhdG9zIHNpbiBzdWF2aXphcgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXRbLCBjZW50cmFsZXNbMToyNl1dLCB0eXBlID0gJ2wnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCBsdHkgPSAxLCBsd2QgPSAwLjgsCiAgICAgICAgY29sID0gJ2N5YW4yJywgbWFpbiA9ICdNZWRpYSByZWNvcnRhZGEnLCAKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykKIyBNZWRpYSByZWNvcnRhZGEKeV9tZWRpYXJlYyA8LSBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MjZdXSwgTUFSR0lOID0gMSwKICAgICAgICAgICAgICAgICAgICBtZWFuKQoKIyBGdW5jaW9uZXMgZ3JhZmljYWRhcwpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWEsIGNvbCA9ICdibGFjaycsIGx3ZCA9IDIsIAogICAgICBsdHkgPSAyKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWFyZWMsIGx3ZCA9IDMsIGNvbCA9ICdyZWQnKQoKIyBJZGVudGlmaWNhbW9zIGNhZGEgY3VydmEKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSBjKCdNZWRpYSByZWNvcnRhZGEnLCAnTWVkaWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRvcyBubyBjb25zaWRlcmFkb3MnKSwgCiAgICAgICBsd2QgPSBjKDMsIDIsIDAuOCksIGNvbCA9IGMoJ3JlZCcsICdibGFjaycsICdjeWFuMicpLCAKICAgICAgIGx0eSA9IGMoMSwgMiwgMSksIGJveC5jb2wgPSAnd2hpdGUnKSAKYGBgCgojIyBGdW5jacOzbiBkZSB2YXJpYW56YQoKU2UgY2FsY3Vsw7MgdXNhbmRvIHRvZG9zIGxvcyBkYXRvcy4KCmBgYHtyfQojIEZ1bmNpw7NuIGRlIHZhcmlhbnphCmZfdmFyIDwtIGFwcGx5KFggPSBmX2hhdCwgTUFSID0gMSwgRlVOID0gdmFyKQoKIyBHcmFmaWNhbW9zCnBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX3ZhciwgZnJhbWUgPSBGQUxTRSwgCiAgICAgbWFpbiA9ICdWYXJpYW56YSBlc3RpbWFkYScsIAogICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgdHlwZSA9ICdsJywgeWxhYiA9ICcnKQpgYGAKCiMjIEZ1bmNpw7NuIGRlIGNvdmFyaWFuemEKCk1vc3RyYW1vcyBsYSBzdXBlcmZpY2llIG9idGVuaWRhLiBDb24gbGEgZnVuY2nDs24gKnBlcnNwKiBvYnRlbmVtb3MgdW5hIGZpZ3VyYSBubyBtdXkgYWdyYWRhYmxlLiBTaW4gZW1iYXJnbywgdXNhcmVtb3MgbGEgZnVuY2nDs24gKnBsb3RfbHkqIHF1ZSBncmFmaWNhcsOhIGxhIHN1cGVyZmljaWUgZW4gdW5hIHDDoWdpbmEgd2ViIHkgdG9tYW1vcyBjYXB0dXJhcyBkZSBwYW50YWxsYS4KCkFwcm92ZWNoYW1vcyBwYXJhIHZpc3VhbGl6YXIgbGFzIGZ1bmNpb25lcyBkZSAqdmFyaWFuemEgeSBjb3ZhcmlhbnphKiwgeSBsYSBtYXRyaXogZGUgKmNvcnJlbGFjaW9uZXMqLgoKYGBge3IsIGluY2x1ZGUgPSBUUlVFfQojIEZ1bmNpw7NuIGRlIGF1dG9jb3ZhcmlhbnphCmNvdl9mIDwtIGNvdih0KGZfaGF0KSkKY29yX2YgPC0gY29yKHQoZl9oYXQpKQoKIyBDb3ZhcmlhbnphCmluZF8xIDwtIHNlcShmcm9tID0gMSwgdG8gPSA1NzEsIGJ5ID0gNSkKZzEgPC0gcGxvdF9seSh4ID0gfnRfcmFuZ29baW5kXzFdLCB5ID0gfnRfcmFuZ29baW5kXzFdLCAKICAgICAgICAgICAgICB6ID0gfmNvdl9mW2luZF8xLCBpbmRfMV0sIAogICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkKZzExIDwtIGcxICU+JSBhZGRfc3VyZmFjZSgpICU+JQogbGF5b3V0KHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAnY292YXJpYW56YScpKSkKcHJpbnQoZzExKQojIENvcnJlbGFjacOzbgpnMiA8LSBwbG90X2x5KHggPSB+dF9yYW5nb1tpbmRfMV0sIHkgPSB+dF9yYW5nb1tpbmRfMV0sIAogICAgICAgICAgICAgIHogPSB+Y29yX2ZbaW5kXzEsIGluZF8xXSwgCiAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKQpnMTIgPC0gZzIgJT4lIGFkZF9zdXJmYWNlKCkgJT4lCiBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICdDb3JyZWxhY2nDs24nKSkpCnByaW50KGcxMikKYGBgCgohW0NvdmFyaWFuemFdKC4vQ2FwdHVyYXMvY292X3Zpc3RhMS5wbmcpCgohW0NvcnJlbGFjacOzbl0oLi9DYXB0dXJhcy9jb3JfdmlzdGExLnBuZykKCk90cmEgZm9ybWEgZGUgdmlzdWFsaXphcmxvIHNlcsOtYSB1c2FuZG8gbWFwYXMgZGUgY2Fsb3IuIEEgY29udGludWNhY2nDs24KCmBgYHtyfQojIE1hcGFzIGRlIGNhbG9yCnBhcihtZnJvdyA9IGMoMSwgMikpCgojIENvdmFyaWFuemFzCmltYWdlKHggPSB0X3JhbmdvLCB5ID0gdF9yYW5nbywgeiA9IGNvdl9mLCAKICAgICAgbWFpbiA9ICdWYXJpYW56YXMgeSBjb3ZhcmlhbnphcycsIAogICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIAogICAgICB5bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIGZyYW1lID0gRkFMU0UpCgojIENvcnJlbGFjaW9uZXMKaW1hZ2UoeCA9IHRfcmFuZ28sIHkgPSB0X3JhbmdvLCB6ID0gY29yX2YsIAogICAgICBtYWluID0gJ01hdHJpeiBkZSBjb3JyZWxhY2lvbmVzJywgCiAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgCiAgICAgIHlsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgZnJhbWUgPSBGQUxTRSkKYGBgCgojIyBMYSBmdW5jacOzbiBkZSBtZWRpYW5hCgpDb3JyZXNwb25kZSBhIGxhIGVzdGltYWNpw7NuIGNvbiBsYSBtYXlvciBkZW5zaWRhZCBkZSB0b2RhcyBsYXMgZXN0aW1hY2lvbmVzLgoKYGBge3J9CiMgTWVkaWFuYQp5X21lZGlhbmEgPC0gZl9oYXRbLCB3aGljaC5tYXgoYnBfZnVuY2lvbmFsJGRlcHRoKV0KCiMgR3JhZmlxdWVtb3MgbGFzIDMgZnVuY2lvbmVzCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBjYmluZCh5X21lZGlhcmVjLCB5X21lZGlhLCB5X21lZGlhbmEpLAogICAgICAgIGx3ZCA9IGMoMSwgMSwgMiksIGNvbCA9IGMoJ2JsYWNrJywgJ2JsdWUnLCAnYnJvd24nKSwgCiAgICAgICAgdHlwZSA9ICdsJywgZnJhbWUgPSBGQUxTRSwgbHR5ID0gMSwgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIAogICAgICAgIG1haW4gPSAnTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbCcpCgpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGJveC5jb2wgPSAnd2hpdGUnLAogICAgICAgbGVnZW5kID0gYygnTWVkaWFuYScsICdNZWRpYScsICdNZWRpYSByZWNvcnRhZGEnKSwgCiAgICAgICBsd2QgPSBjKDIsIDEsIDEpLCBjb2wgPSBjKCdicm93bicsICdibHVlJywgJ2JsYWNrJykpCmBgYAoKIyMgRnVuY2lvbmVzIGN1YW50aWxlcyA5MCUgeSA5NSUKCkN1YW5kbyB0b21hbW9zIGVsICRwXCUkIGRlIGJhbmRhcyBtw6FzIHByb2Z1bmRhcyB5IGNvbnN0cnVpbW9zIGxhIGJhbmRhLCBmdWVyYSBkZSBsYSBiYW5kYSBxdWVkYSAkKDEtcClcJSQgeSBwb3IgZW5kZSAkXGxlZnQoXGZyYWN7MS1wfXsyfVxyaWdodClcJSQgZW4gbG9zIGV4dHJlbW9zLiBMdWVnbywgbGEgYmFuZGEgbcOheGltYSBjdWJyZSAkXGxlZnQocCArIFxmcmFjezEtcH17Mn1ccmlnaHQpXCYkLiBFcyBkZWNpciwgdGVuZW1vcyB1biBjdWFudGlsIHF1ZSBjdWJyZTogCgokcSA9IFxmcmFjezErcH17Mn0gXGltcGxpZXMgcCA9IDJxIC0gMSQKCkVzIGRlY2lyLCBxdWUgc2kgZXNwZWNpZmljYW1vcyBlbCBjdWFudGlsICRxJCwgcG9kcmVtb3Mgc2FiZXIgY3VhbCBlcyBsYSBiYW5kYSAkcCQgYSBlbGVnaXIuCgpFbnRvbmNlcyB0ZW5lbW9zOgoKKyBBbCBjdWFudGlsICRxX3s5MH0kIGxlIGNvcnJlc3BvbmRlIGxhIHJlZ2nDs24gJHAgPSAwLjgkCisgQWwgY3VhbnRpbCAkcV97OTV9JCBsZSBjb3JyZXNwb25kZSBsYSByZWdpw7NuICRwID0gMC45JAoKRW4gZWwgbWlzbW8gZ3LDoWZpY28gcHJlc2VudGFtb3MgbGFzIGZ1bmNpb25lcyBkZSBsb3MgY3VhbnRpbGVzIHNvbGljaXRhZG9zLgoKYGBge3J9CiMgR3LDoWZpY28gZGUgYmFzZQptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXQsIHR5cGUgPSAnbCcsIAogICAgICAgIHBjaCA9IDE5LCBjZXggPSAwLjIsIGZyYW1lID0gRkFMU0UsIAogICAgICAgIG1haW4gPSAnQ3VhbnRpbGVzJywgbHR5ID0gMSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywKICAgICAgICBjb2wgPSAnZ3JheScpCgpjdWFudF85NSA8LSBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MThdXSwgTUFSID0gMSwgbWF4KQptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGN1YW50Xzk1LCBjb2wgPSAnYmx1ZScsIGx3ZCA9IDMsIAogICAgICAgICBsdHkgPSAxKQoKcDAgPC0gc3VtKGFwcGx5KFggPSBmX2hhdCwgTUFSR0lOID0gMiwgCiAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBhbGwoeCA8PSBjdWFudF85NSkpKQojIEN1YW50aWxlcyA5MCUKY3VhbnRfOTAgPC0gYXBwbHkoWCA9IGZfaGF0WywgLWNlbnRyYWxlc1sxOjUxXV0sIE1BUiA9IDEsIG1heCkKcDEgPC0gc3VtKGFwcGx5KFggPSBmX2hhdCwgTUFSR0lOID0gMiwgCiAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBhbGwoeCA8PSBjdWFudF85MCkpKQoKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBjdWFudF85MCwgY29sID0gJ3JlZCcsIGx3ZCA9IDIsIAogICAgICAgICBsdHkgPSAxKQpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGx3ZCA9IDM6MSwgYm94LmNvbCA9ICd3aGl0ZScsCiAgICAgICBjb2wgPSBjKCdibHVlJywgJ3JlZCcsICdncmF5JyksIAogICAgICAgbGVnZW5kID0gYygnQ3VhbnRpbCA5NSUnLCAnQ3VhbnRpbCA5MCUnLCAnRGF0b3MnKSkKYGBgCgojIyBSZWdpw7NuIGNlbnRyYWwgMC43NQoKYGBge3J9CiMgQmFzZSA6dgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXQsIHR5cGUgPSAnbCcsIHBjaCA9IDE5LCAKICAgICAgICBjZXggPSAwLjIsIAogICAgICAgIGZyYW1lID0gRkFMU0UsIG1haW4gPSAnUmVnacOzbiAwLjc1JywgbHR5ID0gMSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywKICAgICAgICBjb2wgPSAnd2hpdGUnKQpjdWFudF83NSA8LSBjYmluZChhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6NjddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgIE1BUiA9IDEsIG1pbiksIAogICAgICAgICAgICAgICAgICBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6NjddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgIE1BUiA9IDEsIG1heCkpCgpwb2x5Z29uKHggPSBjKHRfcmFuZ28sIHRfcmFuZ29bbGVuZ3RoKHRfcmFuZ28pOjFdKSwgCiAgICAgICAgeSA9IGMoY3VhbnRfNzVbLDFdLCAoY3VhbnRfNzVbLDJdKVtsZW5ndGgodF9yYW5nbyk6MV0pLAogICAgICAgIGJvcmRlciA9ICdtaWRuaWdodGJsdWUnLCBhbmdsZSA9IDQ1LCAKICAgICAgICBjb2wgPSAnbWlkbmlnaHRibHVlJywgZGVuc2l0eSA9IDUwKQpgYGAKCiMjIEJveHBsb3QgZnVuY2lvbmFsIHkgb3V0bGllcnMKCkxvcyBuw7ptZXJvcyBxdWUgYXBhcmVjZW4gZW4gbGEgbGV5ZW5kYSBzb24gbG9zIGlkZW50aWZpY2Fkb3JlcyBkZSBsYXMgZnVuY2lvbmVzICRcd2lkZWhhdHt4fSQgY29uc2lkZXJhZGFzIGNvbW8gYXTDrXBpY2FzLiBFbiBlc3RlIGNhc28sIHBvZGVtb3MgY29uc2lkZXJhciBxdWUgc2UgdHJhdGFuIGRlICpvdXRsaWVycyBwYXJjaWFsZXMqLiBMYXMgb2JzZXJ2YWNpb25lcyAxMzEsIDcxIHkgMTAsIHRpZW5lbiB1bmEgcmVnacOzbiAgKGludGVydmFsbyAzNTAtNDUwIGFwcm94aW1hZGFtZW50ZSkgZW4gbGEgcXVlIGxhcyBjdXJ2YXMgbyBiaWVuIGRlY3JlY2VuIGRlIGZvcm1hIG11eSBzdWF2ZSBvIGJpZW4gc2UgY29tcG9ydGFuIGRlIGZvcm1hIGNyZWNpZW50ZSAoY29udHJhcmlvIGFsIGJveHBsb3QgcXVlIHRlbmVtb3MgZGUgZm9uZG8pLiAKCmBgYHtyfQojIEJveHBsb3QgZnVuY2lvbmFsCmZicGxvdChmaXQgPSBmX2hhdCwgeCA9IHRfcmFuZ28sIHlsaW0gPSBjKC0xMCwgNTAwKSwgCiAgICAgICBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ0JveHBsb3QgZnVuY2lvbmFsJywgCiAgICAgICB4bGltID0gcmFuZ2UodF9yYW5nbyksIG91dGxpZXJjb2wgPSAnd2hpdGUnLCAKICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCBhbHBoYS5mID0gMC4yKSwgCiAgICAgICBjb2xvciA9IGFkanVzdGNvbG9yKCdicm93bicsIGFscGhhLmYgPSAwLjIpLAogICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykgLT4gYnBfZnVuY2lvbmFsCgptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGZfaGF0WywgYnBfZnVuY2lvbmFsJG91dHBvaW50XSwgCiAgICAgICAgIGx0eSA9IDEsICBsd2QgPSAzLCAKICAgICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JywgJ2luZGlhbnJlZDQnKSkKCmxlZ2VuZChsZWdlbmQgPSBicF9mdW5jaW9uYWwkb3V0cG9pbnQsIHggPSAndG9wcmlnaHQnLCBsd2QgPSAzLAogICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JywgJ2luZGlhbnJlZDQnKSwgCiAgICAgICBuY29sID0gMiwgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgCiAgICAgICBsdHkgPSAxLCBiZyA9ICdhenVyZTEnKQpgYGAKCiMjIEJveHBsb3QgZnVuY2lvbmFsIGFqdXN0YWRvIHkgb3V0bGllcnMKCjEuIERlYmlkbyBhIGxhcyBkaWZpY3VsdGFkZXMgcXVlIGVuY29udHJhbW9zIHBhcmEgaW1wbGVtZW50YXIgbGEgZXN0aW1hY2nDs24gZGUgbGEgKm1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyByb2J1c3RhKiB1c2Ftb3MgZG9zIGZvcm1hcy4gUHJpbWVybyBjb24gZWwgcGFxdWV0ZSAqcm9haGQqLgoKTGEgdGFzYSBwb3NpdGl2YSBkZSBvdXRsaWVycyBxdWUgdXNhbW9zIGZ1ZSBkZSA5OS43JS4KCmBgYHtyfQojIExpYnJlcsOtYSBlc3BlY2lhbApsaWJyYXJ5KHJvYWhkKQpzZXQuc2VlZCgzMTQpCgojIEVzdHJ1Y3R1cmEKZl9kIDwtIGZEYXRhKGdyaWQgPSB0X3JhbmdvLCB2YWx1ZXMgPSB0KGZfaGF0KSkKcGJmXzEgPC0gZmJwbG90KERhdGEgPSBmX2QsIERlcHRocyA9ICdNQkQnLCAKICAgICAgICAgICAgICAgIGFkanVzdCA9IGxpc3QoTl90cmlhbHMgPSAxLCB0cmlhbF9zaXplID0gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFIgPSAwLjAwMDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZfbWF4ID0gMiksIGRpc3BsYXkgPSBGQUxTRSkKZiA8LSBwYmZfMSRGdmFsdWUKYGBgCgpDb24gbG8gcXVlIG9idHV2aW1vcyB1biB2YWxvciBwYXJhIGVsIGhpcGVycGFyw6FtZXRybyAqRiogZGUgYHIgcm91bmQoZiwgNClgLgoKYGBge3J9CnBhcihtZnJvdyA9IGMoMiwgMikpCm91dF8yIDwtIGxpc3QoeDEgPSBjKDEsIDgsIDkpLAogICAgICAgICAgICAgIHgyID0gYygyLCA0LCAxMCksCiAgICAgICAgICAgICAgeDMgPSBjKDMsIDU6NykpCmNvbCA8LSBjKCdibHVlNCcsICdicm93bicsICdncmF5NDUnKSAKCmZvcihpIGluIDE6bGVuZ3RoKG91dF8yKSl7CmJwX2YxIDwtIGZkYTo6ZmJwbG90KGZpdCA9IGZfaGF0LCB4ID0gdF9yYW5nbywgeWxpbSA9IGMoLTEwLCA1MDApLCAKICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBGQUxTRSwgbWFpbiA9ICdCb3hwbG90IGZ1bmNpb25hbCcsIAogICAgICAgICAgICAgICAgICAgICB4bGltID0gcmFuZ2UodF9yYW5nbyksIGZhY3RvciA9IGYsCiAgICAgICAgICAgICAgICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuZiA9IDAuMSksIAogICAgICAgICAgICAgICAgICAgICBvdXRsaWVyY29sID0gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhZGp1c3Rjb2xvcignYnJvd24nLCBhbHBoYS5mID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICdGbHVvcmVzZW5jaWEnKQoKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdFssIGJwX2YxJG91dHBvaW50WyBvdXRfMltbaV1dXSBdLAogICAgICAgICBsd2QgPSAyLAogICAgICAgICBsdHkgPSAxOjQsCiAgICAgICAgIGNvbCA9IGNvbFtpXSkKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSBicF9mMSRvdXRwb2ludFtvdXRfMltbaV1dXSwgbHR5ID0gMTo0LCAKICAgICAgIGx3ZCA9IDIsIGNvbCA9IGNvbFtpXSwgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmcgPSAnYXp1cmUxJykKfQoKYGBgCgpWZW1vcyBxdWUgYWp1c3RhbmRvIGVsIGZhY3Rvciwgb2J0ZW5lbW9zIGxvcyAzIG91dGxpZXJzIGRlIGFudGVzIChvdXRsaWVycyBwYXJjaWFsZXMpLiBEZSBpZ3VhbCBmb3JtYSwgbG9zIGRhdG9zIDEzLCAxNSB5IDI2OCB0YW1iacOpbiByZXN1bHRhbiBzZXIgb3V0bGllcnMgcGFyY2lhbGVzLCBwdWVzIHZlbW9zIHF1ZSBlbiBjaWVydGFzIHJlZ2lvbmVzIHNlIGNvbXBvcnRhbiBkZSBmb3JtYSBkaXN0aW50YSBhbCByZXN0byBkZSBmdW5jaW9uZXMuIEZpbmFsbWVudGUgc2Ugb2J0aWVuZW4gbG9zIG91dGxpZXJzIGNvcnJlc3BvbmRpZW50ZXMgYSBsb3MgZGF0b3MgMTQsIDE2LCAxNyB5IDM4LiBFc3RvcyDDumx0aW1vcyBlcyBtw6FzIGRpZsOtY2lsIGRlIGp1c3RpZmljYXIgY29uIHVuYSBzaW1wbGUgdmlzdWFsaXphY2nDs24sIHB1ZXMgZW4gbGFzIHBhcnRlcyBlbiBkb25kZSBzYWxlbiBkZWwgYm94cGxvdCBzb24gbXV5IHBvY2FzIHkgcGVxdWXDsWFzLgoKc29sbyBvYnRlbmVtb3MgMyBkYXRvcyBhdMOtcGljb3MuIEp1c3RhbWVudGUgbG9zIDMgZGF0b3MgcXVlIGhhYsOtYW1vcyBjYXRhbG9nYWRvcyBjb21vIG91dGxpZXJzIHBhcmNpYWxlcyAoeSBxdWUgZW4gY2llcnRhIG1lZGlkYSwgZXJhIG3DoXMgc2VuY2lsbG8ganVzdGlmaWNhciBwb3JxdcOpIGVyYW4gb3V0bGllcnMpLgoKMi4gQ29tbyBhbHRlcm5hdGl2YSwgcHJvcG9uZW1vcyBiYXNhcm5vcyBlbiB0w6ljbmljYXMgZGUgcmVtdWVzdHJlbyBwYXJhIGVzdGltYXIgZWwgYm94cGxvdCBzaW4gdXNhciBsb3MgcXVlIHBhcmVjZW4gc2VyIGRhdG9zIGF0w61waWNvcyAoZXMgZGVjaXIsIHNpbiBjb25zaWRlcmFyIGxvcyA1IGRhdG9zIHF1ZSBjb25zaWRlcmFiYW1vcyBjb21vIG91dGxpZXJzKSB5IGRlZmluaXIgZWwgdmFsb3IgZGVsICpoaXBlcnBhcsOhbWV0cm8qIEYuCgpMb3MgZ3LDoWZpY29zIG5vcyBheXVkYW4gYSB2ZXIgZWwgZWZlY3RvIGRlIGhhYmVyIGNhbWJpYWRvIGVsIGZhY3RvciAkRiQgZGUgMS41IGEgMS43NCB5IHZlbW9zIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBkYXRvcyBjYXRhbG9nYWRvcyBjb21vIGF0w61waWNvcyBjdWFuZG8gbm8gbG8gc29uIHBhc2EgZGUgdW4gNSUgYSB1biAyJS4KCmBgYHtyfQojIEZpamFtb3Mgc2VtaWxsYQpzZXQuc2VlZCgyKQoKIyDDjW5kaWNlcyBzb2JyZSBsb3MgcXVlIHZhbW9zIGEgbXVlc3RyZWFyCmluZCA8LSAoMTpuY29sKGZfaGF0KSlbLWJwX2Z1bmNpb25hbCRvdXRwb2ludF0KCiMgUmVtdWVzdHJlbwpyZW0gPC0gc2FtcGxlKHggPSBpbmQsIHNpemUgPSAxMDAsIHJlcGxhY2UgPSBUUlVFKQoKIyBTZWxlY2Npw7NuIGRlIG9ic2VydmFjaW9uZXMKZl9yZW0gPC0gZl9oYXRbLCByZW1dCgojIEJveHBsb3QKcGFyKG1mcm93ID0gYygxLCAyKSkKZmRhOjpmYnBsb3QoZl9yZW0sIHggPSB0X3JhbmdvLCB4bGltID0gcmFuZ2UodF9yYW5nbyksIAogICAgICAgICAgICB5bGltID0gYygtNSwgNTAwKSwgZnJhbWUgPSBGQUxTRSwgCiAgICAgICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgY2V4LmF4aXMgPSAwLjcsCiAgICAgICAgICAgIGNleC5sYWIgPSAwLjcsCiAgICAgICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywgCiAgICAgICAgICAgIG1haW4gPSAnUmVtdWVzdHJlbycpJG91dHBvaW50CmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gJ091dGxpZXJzOiA1JScsIAogICAgICAgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmcgPSAnY3lhbjInLCBjZXggPSAwLjcpCgojIENhbWJpYW1vcyBsb3MgZmFjdG9yZXMKZmRhOjpmYnBsb3QoZl9yZW0sIHggPSB0X3JhbmdvLCB4bGltID0gcmFuZ2UodF9yYW5nbyksIAogICAgICAgICAgICB5bGltID0gYygtNSwgNTAwKSwgZnJhbWUgPSBGQUxTRSwgCiAgICAgICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgZmFjdG9yID0gMS43NCwKICAgICAgICAgICAgY2V4LmF4aXMgPSAwLjcsIGNleC5sYWIgPSAwLjcsIAogICAgICAgICAgICB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIAogICAgICAgICAgICBtYWluID0gJ1JlYWp1c3RlIGRlIGZhY3RvciBGJykkb3V0cG9pbnQKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSAnT3V0bGllcnM6IDIlJywgCiAgICAgICBib3guY29sID0gJ3doaXRlJywKICAgICAgIGJnID0gJ2N5YW4yJywgY2V4ID0gMC43KQpgYGAKCk1vc3RyYW1vcyBhIGNvbnRpbnVhY2nDs24gZWwgYm94cGxvdCByZXN1bHRhbnRlIGFsIG1vZGlmaWNhciBlbCBmYWN0b3IgRi4KCmBgYHtyfQojIEJveHBsb3QgZnVuY2lvbmFsCnBhcihtZnJvdyA9IGMoMSwgMSkpCmZkYTo6ZmJwbG90KGZpdCA9IGZfaGF0LCB4ID0gdF9yYW5nbywgeWxpbSA9IGMoLTEwLCA1MDApLCAKICAgICAgIGZyYW1lID0gRkFMU0UsIG1haW4gPSAnQm94cGxvdCBmdW5jaW9uYWwgYWp1c3RhZG8nLCAKICAgICAgIHhsaW0gPSByYW5nZSh0X3JhbmdvKSwgZmFjdG9yID0gMS43NCwKICAgICAgIG91dGxpZXJjb2wgPSAnd2hpdGUnLCAKICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCBhbHBoYS5mID0gMC4yKSwgCiAgICAgICBjb2xvciA9IGFkanVzdGNvbG9yKCdicm93bicsIGFscGhhLmYgPSAwLjIpLAogICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykgLT4gYnBfZnVuY2lvbmFsMQptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGZfaGF0WywgYnBfZnVuY2lvbmFsMSRvdXRwb2ludF0sIGx0eSA9IDEsIAogICAgICAgICBsd2QgPSAzLCBjb2wgPSBjKCdibHVlNCcsICdkZWVwcGluazQnKSkKbGVnZW5kKGxlZ2VuZCA9IGJwX2Z1bmNpb25hbDEkb3V0cG9pbnQsIHggPSAndG9wcmlnaHQnLCBsd2QgPSAzLAogICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JyksIAogICAgICAgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgbHR5ID0gMSwKICAgICAgIGJnID0gJ2F6dXJlMScpCmBgYAoKQXVucXVlIHBhcmVjZSBtw6FzIGFjZXJ0YWRhIGxhIHNhbGlkYSBkZSBsYSBmdW5jacOzbiAqKnJvYWhkOjpmYnBsb3QqKiB1c2FuZG8gZWwgcGFyw6FtZXRybyAqYWRqdXN0Ki4KCiMjIExhIGZ1bmNpw7NuIG1lZGlhbmEgbXVsdGl2YXJpYWRhCgpFbCBuaXZlbCBkZSBleGNpdGFjacOzbiBxdWUgaGFiw61hbW9zIGVsZWdpZG8gaW5pY2FsbWVudGUgZnVlIGRlIDM0MC4gUGFyYSBsbGV2YXIgYSBjYWJvIGxvcyBwcm9jZWRpbWllbnRvcyBtdWx0aXZhcmlhZG9zLCB0b21hbW9zIG90cm8gbml2ZWwgZGUgb25kYSBjb3JyZXNwb25kaWVudGUgYWwgdmFsb3IgMzI1LiAKCkVzIGRlY2lyIHF1ZSB0ZW5lbW9zIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGZ1bmNpb25hbGVzIGJpdmFyaWFkby4gVmVhbW9zIHLDoXBpZGFtZW50ZSBlbCBudWV2byBjb25qdW50byBkZSBkYXRvcyB5IGxvcyBzdWF2aXphbW9lbnRvcyBjb3JyZXNwb25kaWVudGVzLgoKYGBge3J9CiMgSGFjZW1vcyBsYSBsZWN0dXJhIGRlIGxvcyBkYXRvcwpkYXRvczIgPC0gcmVhZC50YWJsZShjb2xDbGFzc2VzID0gcmVwKGMoJ05VTEwnLCAnbnVtZXJpYycsICdOVUxMJyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoNSwgMSwgMSkqNTcxKSwgZmlsZSA9IHJ1dGEpCgojIFZpc3VhbGl6YWNpb25lcwpwYXIobWZyb3cgPSBjKDEsIDIpKQoKbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IHQoZGF0b3MyKSwgdHlwZSA9ICdsJywgZnJhbWUgPSBGQUxTRSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIEVzcGVjdHJhbCcsIG1haW4gPSAnTml2ZWwgMzI1JywgeWxhYiA9ICcnKQoKIyBBanVzdGUKYmsyIDwtIGMoMjc1LCAzMDAsIDMzMCwgMzcwLCA0MDAsIDQzMCwgNDcwLCA1MDAsIDUyMCwgNTYwKQpiYXNlX2JzcDIgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYnJlYWtzID0gYmsyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcmRlciA9IDQpCmFqdXN0ZV9kZXRhbGxhZG8yIDwtIHNtb290aC5iYXNpcyhhcmd2YWxzID0gdF9yYW5nbywgeSA9IHQoZGF0b3MyKSwgZmRQYXJvYmogPSBiYXNlX2JzcDIpCgpmX2hhdDIgPC0gZXZhbC5mZChldmFsYXJnID0gdF9yYW5nbywgZmRvYmogPSBhanVzdGVfZGV0YWxsYWRvMiRmZCkKCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdDIsIHR5cGUgPSAnbCcsIGZyYW1lID0gRkFMU0UsCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBFc3BlY3RyYWwnLCBtYWluID0gJ0N1cnZhcyBTdWF2aXphZGFzJywKICAgICAgICB5bGFiID0gJycpCgojIFBhc2Ftb3MgYSBkYXRvcyBtdWx0aXYKbXVsdGkgPC0gbWZEYXRhKGdyaWQgPSB0X3JhbmdvLCBEYXRhX2xpc3QgPSBsaXN0KFgxID0gdChmX2hhdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDIgPSB0KGZfaGF0MikpKQoKIyBNZWRpYW5hIG11bHRpdgptZWRpYW5hX211bHRpIDwtIG1lZGlhbl9tZkRhdGEobWZEYXRhID0gbXVsdGkpCm1lZGlhbmFfcG9zIDwtIHdoaWNoLm1heChtdWx0aU1CRChtdWx0aSkpCmBgYAoKRWwgZ3LDoWZpY28gcmVzcGVjdGl2byBkZSBsYSBtZWRpYW5hIG11bHRpdmFyaWFkYToKCmBgYHtyfQpwbG90KG1lZGlhbmFfbXVsdGksIG1haW4gPSAnTWVkaWFuYSBtdWx0aXZhcmlhZGEsIElEIDE3NScsIAogICAgIGZyYW1lID0gRkFMU0UsCiAgICAgbHdkID0gMiwgY29sID0gJ2dyYXknKQpgYGAKCiMjIE91dGxpZXJzIG11bHRpdmFyaWFkb3MKCk1vc3RyYW1vcyBsb3MgaWRlbnRpZmljYWRvcmVzIGRlIGxvcyBpbmRpdmlkdW9zIHF1ZSBhcGFyZWNlbiBjb21vIGF0w61waWNvcy4gCgpgYGB7cn0KcGFyKG1mcm93ID0gYygxLCAxKSkKZmJwbG90KG11bHRpLCBmcmFtZSA9IEZBTFNFKSAtPiBicF9tdWx0aQoKYnBfbXVsdGkkSURfb3V0bGllcnMKCmRldGFjaCgncGFja2FnZTpyb2FoZCcsIHVubG9hZCA9IFRSVUUpCmBgYAoKQ29tbyB2ZW1vcywgbG9zIGluZGl2aWR1b3MgMTAsIDcxIHkgMTMxIGFwYXJlY2VuIG51ZXZhbWVudGUgY29tbyBkYXRvcyBhdMOtcGljb3MgKGHDum4gY29uc2lkZXJhbmRvIGxvcyBkYXRvcyBtdWx0aXZhcmlhZG9zKS4gU2luIGVtYmFyZ28gbm9zIGxsYW3DsyBsYSBhdGVuY2nDs24gcXVlIGVsIGluZGl2aWR1byAxNSBubyBmdWVzZSB1biBvdXRsaWVyIGEgbml2ZWwgbXVsdGl2YXJpYWRvIHBlcm8gbG9zIGluZGl2aWR1b3MgMTQgeSAxNiBzaS4KCgojIEFydMOtY3VsbzogQ29tcGFyYXRpdmUgc3R1ZHkgb2YgZGlmZmVyZW50IEItc3BsaW5lIGFwcHJvYWNoZXMgZm9yIGZ1bmN0aW9uYWwgZGF0YSB7LnRhYnNldH0KCgoqKlJlZmVyZW5jaWEgZGVsIGFydMOtY3VsbzoqKgpBZ3VpbGVyYSwgQS4gTS4sICYgQWd1aWxlcmEtTW9yaWxsbywgTS4gQy4gKDIwMTMpLiBDb21wYXJhdGl2ZSBzdHVkeSBvZgpkaWZmZXJlbnQgQi1zcGxpbmUgYXBwcm9hY2hlcyBmb3IgZnVuY3Rpb25hbCBkYXRhLiBNYXRoZW1hdGljYWwgYW5kCkNvbXB1dGVyIE1vZGVsbGluZywgNTgoNy04KSwgMTU2OC0xNTc5LgoKU2lndWllbmRvIGxhIGNvbnRydWNjacOzbiBkZWwgYXJ0w61jdWxvIGRlIEFndWlsZXJhLCBzZSBnZW5lcmFuIGxvcyBkYXRvcyBzaW11bGFkb3MsIGdlbmVyYW5kbyAxMDAgY3VydmFzIGRlIHVuIHByb2Nlc28gZXN0b2PDoXN0aWNvIGRlIG1lZGlhIGNlcm8gcXVlIHNpZ3VlIHF1ZSBjYWRhIGN1cnZhIFgsIHBvc2VlIHVuIGNvbXBvcnRhbWllbnRvIGRhZG8gcG9yICRYICh0KT1SIGNvcyAoMlxwaSB0KyBcdGhldGEpJCwgZW4gZWwgY3VhbCAkUiQgeSAkXHRoZXRhJCBwcm92aWVuZW4gZGUgdW5hIGRpc3RyaWJ1Y2nDs24gIGkuaS5kIFJheWxlaWdoKCRcc2lnbWEkKSwgY29uICRcc2lnbWE9MC4zJCB5IFVuaWZvcm1lICRbMCwyXHBpXSQsIHJlc3BlY3RpdmFtZW50ZS4KClNlIHJlYWxpemEgdW5hIG11ZXN0cmEgZGUgb2JzZXJ2YWNpb25lcyBjb24gNTEgbm9kb3MgKGtub3RzKSBpZ3VhbG1lbnRlIGVzcGFjaWFkb3MgZW4gZWwgaW50ZXJ2YWxvICRUPVswLDFdJCwgZW4gZWwgY3VhbCBsb3MgZXJyb3JlcyBkZSBjYWRhIGN1cnZhIHNlIGNvbXBvcnRhbiBkZSBtYW5lcmEgJE5vcm1hbCgwLFxzaWdtYcKyKSQgY29uICRcc2lnbWHCsj0wLjA3JAoKCgoKYGBge3J9ClI8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKdGhldGE8LXJ1bmlmKDEsMCwyKnBpKQpgYGAKCgoKYGBge3J9CiMgU2UgY3JlYSBsYSBmdW5jacOzbiBxdWUgZ2VuZXJhIGxhcyBzaW11bGFjaW9uZXMKdHJ1ZV9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oeCl7Uipjb3MoMipwaSp4K3RoZXRhKX0KdHJ1ZV9mdW5jdGlvbnNfMiA8LSBmdW5jdGlvbih4LFJfaW4sdGhldGFfaW4pe1JfaW4qY29zKDIqcGkqeCt0aGV0YV9pbil9CgpgYGAKCmBgYHtyfQoKI1NlIGdlbmVyYSBsYSBmdW5jacOzbiBxdWUgYnJpbmRhIGxvcyB2YWxvcmVzIHBhcmEgZ2VuZXJhciBsYSBzaW11bGFjacOzbiBjb24gbG9zIGVycm9yZXMgcHJvcHVlc3RvcyBlbiBlbCBhcnTDrWN1bG8Kc2ltdWxhdGVkX2Z1bmN0aW9ucyA8LSBmdW5jdGlvbihsZW5naHQub3V0PTUxLFJfaW4sdGhldGFfaW4pewplcnJvcnM8LXJub3JtKGxlbmdodC5vdXQsbWVhbiA9IDAsIHNkPXNxcnQoMC4wNykpCmxlbmdfdGltZT1zZXEoMCwxLGxlbj1sZW5naHQub3V0KQp2YWx1ZXM8LVJfaW4qY29zKDIqcGkqbGVuZ190aW1lK3RoZXRhX2luKStlcnJvcnMKCnJldHVybih2YWx1ZXMpCiAgfQpgYGAKCioqUmVncmVzc2lvbiBTcGxpbmVzKioKTGEgcHJpbWVyYSBjdXJ2YSBhIHBhcnRpciBkZSB1biAkUiQgeSAkXHRoZXRhJCBhbGVhdG9yaW8gc2UgY29uc3RydXllLCBzaWd1aWVuZG8gbGFzIGRvcyBiYXNlcyBkZSBudWVzdHJvIGludGVyw6lzLiBUYW50byBGb3VyaWVyIGNvbW8gQi1TcGxpbmVzCgpgYGB7cn0Kc2ltdWxhdGVkX2N1cnZlPC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVIsdGhldGFfaW49dGhldGEpLGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIikKYGBgCgoKCmBgYHtyfQpjcmVhdGVfcmVncmVzc2lvbjwtZnVuY3Rpb24obmJhc2lzLGN1cnZlKXsKICBiYXNpc29iaiA9IGNyZWF0ZS5ic3BsaW5lLmJhc2lzKGMoMCwxKSxuYmFzaXMpCiAgYWp1c3RlIDwtIERhdGEyZmQoeSA9IGN1cnZlJHksIGJhc2lzb2JqID1iYXNpc29iaiwgCiAgICAgICAgICAgICAgICAgIGFyZ3ZhbHMgPSBzZXEoMCwxLGxlbj01MSkpCiAgZGYgPC0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSwgeSA9IHByZWRpY3QoYWp1c3RlLCBuZXdkYXRhPXNlcSgwLDEsbGVuPTUxKSksY2F0PXBhc3RlKGFzLmNoYXJhY3RlcihuYmFzaXMpLCJiYXNpYyBrbm90cyIpKQogIHJldHVybihkZikKfQoKcmVnXzU8LWNyZWF0ZV9yZWdyZXNzaW9uKDUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMTU8LWNyZWF0ZV9yZWdyZXNzaW9uKDE1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzI1PC1jcmVhdGVfcmVncmVzc2lvbigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgoKYGBge3J9CmNyZWF0ZV9yZWdyZXNzaW9uX2ZvdXJpZXI8LWZ1bmN0aW9uKG5iYXNpcyxjdXJ2ZSl7CiAgYmFzaXNvYmogPSBjcmVhdGUuZm91cmllci5iYXNpcyhyYW5nZXZhbD1jKDAsMSksIG5iYXNpcz1uYmFzaXMpCiAgYWp1c3RlIDwtIERhdGEyZmQoeSA9IGN1cnZlJHksIGJhc2lzb2JqID1iYXNpc29iaiwgCiAgICAgICAgICAgICAgICAgIGFyZ3ZhbHMgPSBzZXEoMCwxLGxlbj01MSkpCiAgZGYgPC0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSwgeSA9IHByZWRpY3QoYWp1c3RlLCBuZXdkYXRhPXNlcSgwLDEsbGVuPTUxKSksY2F0PXBhc3RlKGFzLmNoYXJhY3RlcihuYmFzaXMpLCJiYXNpYyBrbm90cyIpKQogIHJldHVybihkZikKfQoKcmVnXzVfZjwtY3JlYXRlX3JlZ3Jlc3Npb25fZm91cmllcig1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzE1X2Y8LWNyZWF0ZV9yZWdyZXNzaW9uX2ZvdXJpZXIoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfZjwtY3JlYXRlX3JlZ3Jlc3Npb25fZm91cmllcigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgpzZSBjcmVhIGxhIGJhc2UgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHJlZ3Jlc2lvbmVzIHNwbGluZXMgeSBzbW9vdGhpbmcgc3BsaW5lcywgZ2VuZXJhZGFzIGEgcGFydGlyIGRlIGJhc2VzIEItU3BsaW5lcyB5IEJhc2VzIGRlIEZvdXJpZXIsIHJlc3BlY3RpdmFtZW50ZSwgY29uIDUxIG5vZG9zIGVuIGVsIGludGVydmFsbyAkVD1bMCwxXSQKYGBge3J9CnBfcmVnX2I8LWdncGxvdChkYXRhLmZyYW1lKHg9YygwLDEpLGNhdD0iVHJ1ZSBmdW5jdGlvbiIpLCBhZXMoeD14LGNvbG91cj1jYXQpKSArIHN0YXRfZnVuY3Rpb24oZnVuPXRydWVfZnVuY3Rpb25zKSsgZ2VvbV9saW5lKGRhdGEgPSBzaW11bGF0ZWRfY3VydmUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzE1LGxpbmV0eXBlID0gImxvbmdkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzI1LGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJUcnVlIGZ1bmN0aW9uIj0iYmxhY2siLCJTaW11bGF0ZWQgZnVuY3Rpb24iID0gIm9yYW5nZSIsICI1IGJhc2ljIGtub3RzIiA9ICJibHVlIiwiMTUgYmFzaWMga25vdHMiPSJyZWQiLCIyNSBiYXNpYyBrbm90cyI9ImdyZWVuIikpKyB0aGVtZV9idygpK3hsYWIoIkJhc2UgQi1TcGxpbmUiKQpwX3JlZ19mPC1nZ3Bsb3QoZGF0YS5mcmFtZSh4PWMoMCwxKSxjYXQ9IlRydWUgZnVuY3Rpb24iKSwgYWVzKHg9eCxjb2xvdXI9Y2F0KSkgKyBzdGF0X2Z1bmN0aW9uKGZ1bj10cnVlX2Z1bmN0aW9ucykrIGdlb21fbGluZShkYXRhID0gc2ltdWxhdGVkX2N1cnZlLGxpbmV0eXBlID0gImRvdHRlZCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IHJlZ181X2YsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzE1X2YsbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjVfZixsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ3VydmVzIiwgdmFsdWVzID0gYygiVHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiU2ltdWxhdGVkIGZ1bmN0aW9uIiA9ICJvcmFuZ2UiLCAiNSBiYXNpYyBrbm90cyIgPSAiYmx1ZSIsIjE1IGJhc2ljIGtub3RzIj0icmVkIiwiMjUgYmFzaWMga25vdHMiPSJncmVlbiIpKSsgdGhlbWVfYncoKSt4bGFiKCJCYXNlIEZvdXJpZXIiKQpwX3JlZ19iL3BfcmVnX2YKYGBgCgoKCgoKCgoKCgpgYGB7cn0Kc2FtcGxlc19yZWdyZXNzaW9uPC1mdW5jdGlvbihuYmFzaXNfaW4pewogUl9hdXg8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKIHRoZXRhX2F1eDwtcnVuaWYoMSwwLDIqcGkpCiBzaW11bGF0ZWRfY3VydmVfYXV4PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVJfYXV4LHRoZXRhX2luPXRoZXRhX2F1eCksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKQogcmV0dXJuKGxpc3QoY3JlYXRlX3JlZ3Jlc3Npb24obmJhc2lzX2luLHNpbXVsYXRlZF9jdXJ2ZV9hdXgpKSkKfQoKYGBgCgoKYGBge3J9CnNhbXBsZXNfcmVnXzU8LWxpc3QoKQpzYW1wbGVzX3JlZ18xNTwtbGlzdCgpCnNhbXBsZXNfcmVnXzI1PC1saXN0KCkKZm9yKGkgaW4gMToxMDApewogIHNhbXBsZXNfcmVnXzU8LWFwcGVuZChzYW1wbGVzX3JlZ181LGxpc3Qoc2FtcGxlc19yZWdyZXNzaW9uKDUpKSkKICBzYW1wbGVzX3JlZ18xNTwtYXBwZW5kKHNhbXBsZXNfcmVnXzE1LGxpc3Qoc2FtcGxlc19yZWdyZXNzaW9uKDE1KSkpCiAgc2FtcGxlc19yZWdfMjU8LWFwcGVuZChzYW1wbGVzX3JlZ18yNSxsaXN0KHNhbXBsZXNfcmVncmVzc2lvbigyNSkpKQp9CmBgYAoKCgoqKlNtb290aGluZyBTcGxpbmVzKioKCmBgYHtyfQpjcmVhdGVfc21fc3BsaW5lczwtZnVuY3Rpb24obmJhc2lzLGN1cnZlLGQ9MixsYW1iZGE9MTBeKC0yKSl7CiAgYmFzaXNvYmogPSBjcmVhdGUuYnNwbGluZS5iYXNpcyhjKDAsMSksbmJhc2lzKQogIGZkUGFyb2JqID0gZmRQYXIoYmFzaXNvYmosIGQsIGxhbWJkYSkKICBzbW9vdGhsaXN0bm93dCA9IHNtb290aC5iYXNpcyhzZXEoMCwxLGxlbj01MSksICBjdXJ2ZSR5LCBmZFBhcm9iaikKICBhanVzdGUgPC0gc21vb3RobGlzdG5vd3QkZmQKICBkZiA8LSBzdXBwcmVzc1dhcm5pbmdzKGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSksIHkgPSBwcmVkaWN0KGFqdXN0ZSwgbmV3ZGF0YT1zZXEoMCwxLGxlbj01MSkpLGNhdD1wYXN0ZShhcy5jaGFyYWN0ZXIobmJhc2lzKSwiYmFzaWMga25vdHMiKSxnY3Y9c21vb3RobGlzdG5vd3QkZ2N2KSkKICByZXR1cm4oZGYpCn0KCmNyZWF0ZV9zbV9zcGxpbmVzX2ZvdXJpZXI8LWZ1bmN0aW9uKG5iYXNpcyxjdXJ2ZSxkPTIsbGFtYmRhPTEwXigtMikpewogIGJhc2lzb2JqID0gY3JlYXRlLmZvdXJpZXIuYmFzaXMoYygwLDEpLG5iYXNpcykKICBmZFBhcm9iaiA9IGZkUGFyKGJhc2lzb2JqLCBkLCBsYW1iZGEpCiAgc21vb3RobGlzdG5vd3QgPSBzbW9vdGguYmFzaXMoc2VxKDAsMSxsZW49NTEpLCAgY3VydmUkeSwgZmRQYXJvYmopCiAgYWp1c3RlIDwtIHNtb290aGxpc3Rub3d0JGZkCiAgZGYgPC0gc3VwcHJlc3NXYXJuaW5ncyhkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLCB5ID0gcHJlZGljdChhanVzdGUsIG5ld2RhdGE9c2VxKDAsMSxsZW49NTEpKSxjYXQ9cGFzdGUoYXMuY2hhcmFjdGVyKG5iYXNpcyksImJhc2ljIGtub3RzIiksZ2N2PXNtb290aGxpc3Rub3d0JGdjdikpCiAgcmV0dXJuKGRmKQp9CgoKYGBgCgoKYGBge3J9CiNDYWxjdWxhciBsYW1iZGEKY2FsY3VsYXJfbGFtYmRhPC1mdW5jdGlvbihpbmljaW8sZmluLHBhc28sbnVtX2Jhc2lzKXsKICBwcnVlYmFzPWxpc3QoKQogIGJhc2VfYXV4PWxpc3QoKQogIGZvcihpIGluIDE6MTAwKXsKICAgIFJfYXV4PC1ycmF5bGVpZ2goMSwgc2NhbGUgPSBzcXJ0KDAuMykpCiAgICB0aGV0YV9hdXg8LXJ1bmlmKDEsMCwyKnBpKQogICAgYmFzZV9hdXg9YXBwZW5kKGJhc2VfYXV4LHNpbXVsYXRlZF9mdW5jdGlvbnMoUl9pbiA9IFJfYXV4LHRoZXRhX2luID0gdGhldGFfYXV4KSkKICB9CiAgZm9yKGkgaW4gbnVtX2Jhc2lzKXsKICAgIGJhc2VfYnNwbGluZXM9Y3JlYXRlLmJzcGxpbmUuYmFzaXMoYygwLDEpLGkpCiAgICBiYXNlX2ZvdXJpZXI9Y3JlYXRlLmZvdXJpZXIuYmFzaXMoYygwLDEpLGkpCiAgICBmb3IoaiBpbiBzZXEoaW5pY2lvLGZpbixwYXNvKSl7CiAgICAgIGZkUGFyb2JqID0gZmRQYXIoYmFzZV9ic3BsaW5lcywgMiwgaikKICAgICAgZmRQYXJvYmpfZiA9IGZkUGFyKGJhc2VfYnNwbGluZXMsIDIsIGopCiAgICAgIHNtb290aGxpc3Rub3d0ID0gc21vb3RoLmJhc2lzKHNlcSgwLDEsbGVuPTUxKSwgIGN1cnZlJHksIGZkUGFyb2JqKQogICAgICBzbW9vdGhsaXN0bm93dF9mID0gc21vb3RoLmJhc2lzKHNlcSgwLDEsbGVuPTUxKSwgIGN1cnZlJHksIGZkUGFyb2JqKQogICAgICBwcnVlYmFzPWFwcGVuZChwcnVlYmFzLGxpc3QoYmFzZT0iYnNwbGluZSIsKSkKICAgICAgcHJ1ZWJhcz1hcHBlbmQocHJ1ZWJhcyxsaXN0KGJhc2U9ImZvdXJpZXIiLCkpCiAgICB9CiAgICAKICB9Cn0KYGBgCgoKCmBgYHtyfQpyZWdfNV9zbTwtY3JlYXRlX3NtX3NwbGluZXMoNSxzaW11bGF0ZWRfY3VydmUpCnJlZ18xNV9zbTwtY3JlYXRlX3NtX3NwbGluZXMoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfc208LWNyZWF0ZV9zbV9zcGxpbmVzKDI1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzVfc21fZjwtY3JlYXRlX3NtX3NwbGluZXNfZm91cmllcig1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzE1X3NtX2Y8LWNyZWF0ZV9zbV9zcGxpbmVzX2ZvdXJpZXIoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfc21fZjwtY3JlYXRlX3NtX3NwbGluZXNfZm91cmllcigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgoKCmBgYHtyfQpwX3NwbDwtZ2dwbG90KGRhdGEuZnJhbWUoeD1jKDAsMSksY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgsY29sb3VyPWNhdCkpICsgc3RhdF9mdW5jdGlvbihmdW49dHJ1ZV9mdW5jdGlvbnMpKyBnZW9tX2xpbmUoZGF0YSA9IHNpbXVsYXRlZF9jdXJ2ZSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfNV9zbSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTVfc20sbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjVfc20sbGluZXR5cGUgPSAiZG90ZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIjUgYmFzaWMga25vdHMiID0gImJsdWUiLCIxNSBiYXNpYyBrbm90cyI9InJlZCIsIjI1IGJhc2ljIGtub3RzIj0iZ3JlZW4iKSkrIHlsYWIoIiIpK3RoZW1lX2J3KCkreGxhYigiQmFzZSBCLVNwbGluZSIpCnBfc3BsX2Y8LWdncGxvdChkYXRhLmZyYW1lKHg9YygwLDEpLGNhdD0iVHJ1ZSBmdW5jdGlvbiIpLCBhZXMoeD14LGNvbG91cj1jYXQpKSArIHN0YXRfZnVuY3Rpb24oZnVuPXRydWVfZnVuY3Rpb25zKSsgZ2VvbV9saW5lKGRhdGEgPSBzaW11bGF0ZWRfY3VydmUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzVfc21fZixsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTVfc21fZixsaW5ldHlwZSA9ICJsb25nZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IHJlZ18yNV9zbV9mLGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJUcnVlIGZ1bmN0aW9uIj0iYmxhY2siLCJTaW11bGF0ZWQgZnVuY3Rpb24iID0gIm9yYW5nZSIsICI1IGJhc2ljIGtub3RzIiA9ICJibHVlIiwiMTUgYmFzaWMga25vdHMiPSJyZWQiLCIyNSBiYXNpYyBrbm90cyI9ImdyZWVuIikpK3lsYWIoIiIpICt0aGVtZV9idygpK3hsYWIoIkJhc2UgRGUgRm91cmllciIpCnBfc3BsL3Bfc3BsX2YKCmBgYAoKCgpQYXJhIGxhcyBncsOhZmljYXMgcXVlIGdlbmVyYSBlbCBhdXRvciwgc2UgZ2VuZXJhbiBsYXMgMTAwIGN1cnZhcyBhIHBhcnRpciBkZSBsYSBzaW11bGFjacOzbiwgdGFsIGNvbW8gc2UgbWVuY2lvbmEgZW4gdW4gaW5pY2lvLCB5IHNlIGdyYWZpY2FuIGxhcyBmdW5jaW9uZXMKCgpgYGB7cn0KUjwtcnJheWxlaWdoKDEsIHNjYWxlID0gc3FydCgwLjMpKQp0aGV0YTwtcnVuaWYoMSwwLDIqcGkpCmBgYAoKCgpgYGB7cn0Kc2FtcGxlc19zbW9vdGhpbmc8LWZ1bmN0aW9uKG5iYXNpc19pbixjYWxjX3ZhcnM9RkFMU0UpewogaWYoY2FsY192YXJzIT1GQUxTRSl7CiBSX2F1eDwtcnJheWxlaWdoKDEsIHNjYWxlID0gc3FydCgwLjMpKQogdGhldGFfYXV4PC1ydW5pZigxLDAsMipwaSkKIH1lbHNlewogIFJfYXV4PVIKICB0aGV0YV9hdXg9dGhldGEKIH0KIHRydWVfZnVuY19hdXg9dHJ1ZV9mdW5jdGlvbnNfMihzZXEoMCwxLGxlbj01MSksUl9hdXgsdGhldGFfYXV4KQogc2ltdWxhdGVkX2N1cnZlX2F1eDwtc3VwcHJlc3NXYXJuaW5ncyhkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVJfYXV4LHRoZXRhX2luPXRoZXRhX2F1eCksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSkKIHNtX2F1eD1zdXBwcmVzc1dhcm5pbmdzKCBjcmVhdGVfc21fc3BsaW5lcyhuYmFzaXNfaW4sc2ltdWxhdGVkX2N1cnZlX2F1eCkpCiBzbV9hdXhfZj1zdXBwcmVzc1dhcm5pbmdzKCBjcmVhdGVfc21fc3BsaW5lc19mb3VyaWVyKG5iYXNpc19pbixzaW11bGF0ZWRfY3VydmVfYXV4KSkKIHJlZ19hdXg9c3VwcHJlc3NXYXJuaW5ncyhjcmVhdGVfcmVncmVzc2lvbihuYmFzaXNfaW4sc2ltdWxhdGVkX2N1cnZlX2F1eCkpCiByZWdfYXV4X2Y9c3VwcHJlc3NXYXJuaW5ncyhjcmVhdGVfcmVncmVzc2lvbl9mb3VyaWVyKG5iYXNpc19pbixzaW11bGF0ZWRfY3VydmVfYXV4KSkKIE1TRV9yZWc9bWVhbigocmVnX2F1eCR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3JlZ19mPW1lYW4oKHJlZ19hdXhfZiR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3NtPW1lYW4oKHNtX2F1eCR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3NtX2Y9bWVhbigoc21fYXV4X2YkeSAtIHNpbXVsYXRlZF9jdXJ2ZV9hdXgkeSleMikKIHJldHVybihsaXN0KHRydWVfZj10cnVlX2Z1bmNfYXV4LHJlZ19zcGw9cmVnX2F1eCR5LHk9c2ltdWxhdGVkX2N1cnZlX2F1eCR5LHlfaGF0PXNtX2F1eCR5LGdjdl9yZWc9cmVnX2F1eCRnY3ZbMV0sZ2N2X3NtPXNtX2F1eCRnY3ZbMV0scmVnX3NwbF9mPXJlZ19hdXhfZiR5LHlfaGF0X2Y9c21fYXV4X2YkeSxnY3Zfc21fZj1zbV9hdXhfZiRnY3YsTVNFX3JlZz1NU0VfcmVnLE1TRV9yZWdfZj1NU0VfcmVnX2YsTVNFX3NtPU1TRV9zbSxNU0Vfc21fZj1NU0Vfc21fZikpCn0KYGBgCgpTZSBncmFmaWNhIGxhIGZ1bmNpw7NuIHJlbGEsIGxhIGZ1bmNpw7NuIHNpbXVsYWRhIGNvbiBlcnJvcmVzIG5vcm1hbGVzLCB5IGNvbiBsYXMgYmFzZXMgcXVlIGRlZmluaW1vcyBlbiBlbCBwbGFudGVhbWllbnRvIGRlIGxhIHNpbXVsYWNpw7NuICg1LCAxNSB5IDI1KS4gQWp1c3RhbmRvIHRhbWJpw6luIFJlZ3Jlc2nDs24gU3BsaW5lIHkgU21vb3RoaW5nIFNwbGluZSBjb24gdW4gJFxsYW1iZGE9MC4wMSQKYGBge3J9CmluZm9fYmFzaXM1XzE8LXNhbXBsZXNfc21vb3RoaW5nKDUpCmluZm9fYmFzaXMxNV8xPC1zYW1wbGVzX3Ntb290aGluZygxNSkKaW5mb19iYXNpczI1XzE8LXNhbXBsZXNfc21vb3RoaW5nKDI1KQpSPC1ycmF5bGVpZ2goMSwgc2NhbGUgPSBzcXJ0KDAuMykpCnRoZXRhPC1ydW5pZigxLDAsMipwaSkKaW5mb19iYXNpczVfMjwtc2FtcGxlc19zbW9vdGhpbmcoNSkKaW5mb19iYXNpczE1XzI8LXNhbXBsZXNfc21vb3RoaW5nKDE1KQppbmZvX2Jhc2lzMjVfMjwtc2FtcGxlc19zbW9vdGhpbmcoMjUpCgpgYGAKCgoKYGBge3J9CnA1XzE8LWdncGxvdChkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzNV8xJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMSRyZWdfc3BsLGNhdD0iUmVncmVzc2lvbiBTcGxpbmVzIiksbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXM1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCnA1XzI8LWdncGxvdChkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMiR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzNV8yJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMiRyZWdfc3BsLGNhdD0iUmVncmVzc2lvbiBTcGxpbmVzIiksbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXM1XzIkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkKcDVfMStwNV8yK3Bsb3RfbGF5b3V0KG5jb2wgPSAyKQoKCmBgYAoKCmBgYHtyfQpwMTVfMTwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMSR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMxNV8xJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczE1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIxNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMTVfMjwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMiR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMiR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMxNV8yJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczE1XzIkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIxNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpCnAxNV8xK3AxNV8yCmBgYAoKCmBgYHtyfQpwMjVfMTwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMSR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8xJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczI1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIyNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCnAyNV8yPC1nZ3Bsb3QoZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8yJHRydWVfZixjYXQ9IlRydWUgZnVuY3Rpb24iKSwgYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpICsgZ2VvbV9saW5lKCkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8yJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczI1XzIkcmVnX3NwbCxjYXQ9IlJlZ3Jlc3Npb24gU3BsaW5lcyIpLGxpbmV0eXBlID0gImRhc2hlZCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMiR5X2hhdCxjYXQ9IlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSIpLGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ3VydmVzIiwgdmFsdWVzID0gYygiVHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiU2ltdWxhdGVkIGZ1bmN0aW9uIiA9ICJvcmFuZ2UiLCAiUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJibHVlIiwiU21vb3RoaW5nIHNwbGluZXMsIExhbWJkYT0wLjAxIj0icmVkIikpK3hsYWIoIjI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkKcDI1XzErcDI1XzIKYGBgCgoKCgpgYGB7cn0KI2Fob3JhIHPDrSBsYXMgbXVlc3RyYXMKc2FtcGxlc19zbW9vdGhfNTwtbGlzdCgpCnNhbXBsZXNfc21vb3RoXzE1PC1saXN0KCkKc2FtcGxlc19zbW9vdGhfMjU8LWxpc3QoKQpmb3IoaSBpbiAxOjEwMCl7CiAgc2FtcGxlc19zbW9vdGhfNTwtYXBwZW5kKHNhbXBsZXNfc21vb3RoXzUsbGlzdChzYW1wbGVzX3Ntb290aGluZyg1LGNhbGNfdmFycyA9IFRSVUUpKSkKICBzYW1wbGVzX3Ntb290aF8xNTwtYXBwZW5kKHNhbXBsZXNfc21vb3RoXzE1LGxpc3Qoc2FtcGxlc19zbW9vdGhpbmcoMTUsY2FsY192YXJzID0gVFJVRSkpKQogIHNhbXBsZXNfc21vb3RoXzI1PC1hcHBlbmQoc2FtcGxlc19zbW9vdGhfMjUsbGlzdChzYW1wbGVzX3Ntb290aGluZygyNSxjYWxjX3ZhcnMgPSBUUlVFKSkpCn0KYGBgCgoKYGBge3J9CiNnZW5lcmFyIGdjdidzCmF1eF9iYXNpc181PC1jKCkKYXV4X2Jhc2lzXzE1PC1jKCkKYXV4X2Jhc2lzXzI1PC1jKCkKYXV4X2Jhc2lzXzVfZjwtYygpCmF1eF9iYXNpc18xNV9mPC1jKCkKYXV4X2Jhc2lzXzI1X2Y8LWMoKQptc2VfYmFzaXM1X3JlZzwtYygpCm1zZV9iYXNpczE1X3JlZzwtYygpCm1zZV9iYXNpczI1X3JlZzwtYygpCm1zZV9iYXNpczVfcmVnX2Y8LWMoKQptc2VfYmFzaXMxNV9yZWdfZjwtYygpCm1zZV9iYXNpczI1X3JlZ19mPC1jKCkKbXNlX2Jhc2lzNV9zbTwtYygpCm1zZV9iYXNpczE1X3NtPC1jKCkKbXNlX2Jhc2lzMjVfc208LWMoKQptc2VfYmFzaXM1X3NtX2Y8LWMoKQptc2VfYmFzaXMxNV9zbV9mPC1jKCkKbXNlX2Jhc2lzMjVfc21fZjwtYygpCmZvcihpIGluIDE6MTAwKXsKICBhdXhfYmFzaXNfNTwtYXBwZW5kKGF1eF9iYXNpc181LHNhbXBsZXNfc21vb3RoXzVbW2ldXSRnY3Zfc20pCiAgYXV4X2Jhc2lzXzE1PC1hcHBlbmQoYXV4X2Jhc2lzXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kZ2N2X3NtKQogIGF1eF9iYXNpc18yNTwtYXBwZW5kKGF1eF9iYXNpc18yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJGdjdl9zbSkKICB1eF9iYXNpc181X2Y8LWFwcGVuZChhdXhfYmFzaXNfNV9mLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRnY3Zfc21fZikKICBhdXhfYmFzaXNfMTVfZjwtYXBwZW5kKGF1eF9iYXNpc18xNV9mLHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kZ2N2X3NtX2YpCiAgYXV4X2Jhc2lzXzI1X2Y8LWFwcGVuZChhdXhfYmFzaXNfMjVfZixzYW1wbGVzX3Ntb290aF8yNVtbaV1dJGdjdl9zbV9mKQogIG1zZV9iYXNpczVfcmVnPC1hcHBlbmQobXNlX2Jhc2lzNV9yZWcsc2FtcGxlc19zbW9vdGhfNVtbaV1dJE1TRV9yZWcpCiAgbXNlX2Jhc2lzMTVfcmVnPC1hcHBlbmQobXNlX2Jhc2lzMTVfcmVnLHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kTVNFX3JlZykKICBtc2VfYmFzaXMyNV9yZWc8LWFwcGVuZChtc2VfYmFzaXMyNV9yZWcsc2FtcGxlc19zbW9vdGhfMjVbW2ldXSRNU0VfcmVnKQogIG1zZV9iYXNpczVfcmVnX2Y8LWFwcGVuZChtc2VfYmFzaXM1X3JlZ19mLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRNU0VfcmVnX2YpCiAgbXNlX2Jhc2lzMTVfcmVnX2Y8LWFwcGVuZChtc2VfYmFzaXMxNV9yZWdfZixzYW1wbGVzX3Ntb290aF8xNVtbaV1dJE1TRV9yZWdfZikKICBtc2VfYmFzaXMyNV9yZWdfZjwtYXBwZW5kKG1zZV9iYXNpczI1X3JlZ19mLHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kTVNFX3JlZ19mKQogIG1zZV9iYXNpczVfc208LWFwcGVuZChtc2VfYmFzaXM1X3NtLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRNU0Vfc20pCiAgbXNlX2Jhc2lzMTVfc208LWFwcGVuZChtc2VfYmFzaXMxNV9zbSxzYW1wbGVzX3Ntb290aF8xNVtbaV1dJE1TRV9zbSkKICBtc2VfYmFzaXMyNV9zbTwtYXBwZW5kKG1zZV9iYXNpczI1X3NtLHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kTVNFX3NtKQogIG1zZV9iYXNpczVfc21fZjwtYXBwZW5kKG1zZV9iYXNpczVfc21fZixzYW1wbGVzX3Ntb290aF81W1tpXV0kTVNFX3NtX2YpCiAgbXNlX2Jhc2lzMTVfc21fZjwtYXBwZW5kKG1zZV9iYXNpczE1X3NtX2Ysc2FtcGxlc19zbW9vdGhfMTVbW2ldXSRNU0Vfc21fZikKICBtc2VfYmFzaXMyNV9zbV9mPC1hcHBlbmQobXNlX2Jhc2lzMjVfc21fZixzYW1wbGVzX3Ntb290aF8yNVtbaV1dJE1TRV9zbV9mKQp9CgpkZl9nY3Y8LWFzLmRhdGEuZnJhbWUoYyhhdXhfYmFzaXNfNSxhdXhfYmFzaXNfMTUsYXV4X2Jhc2lzXzI1KSkKZGZfZ2N2X2Y8LWFzLmRhdGEuZnJhbWUoYyhhdXhfYmFzaXNfNV9mLGF1eF9iYXNpc18xNV9mLGF1eF9iYXNpc18yNV9mKSkKZGZfZ2N2JGJhc2lzPC1jKHJlcCgiNSBiYXNpYyBrbm90cyIsMTAwKSxyZXAoIjE1IGJhc2ljIGtub3RzIiwxMDApLHJlcCgiMjUgYmFzaWMga25vdHMiLDEwMCkpCmRmX2djdl9mJGJhc2lzPC1jKHJlcCgiNSBiYXNpYyBrbm90cyIsMTAwKSxyZXAoIjE1IGJhc2ljIGtub3RzIiwxMDApLHJlcCgiMjUgYmFzaWMga25vdHMiLDEwMCkpCmNvbG5hbWVzKGRmX2djdik8LWMoInZhbHVlIiwiYmFzaXMiKQpjb2xuYW1lcyhkZl9nY3ZfZik8LWMoInZhbHVlIiwiYmFzaXMiKQoKZGZfbXNlXzU8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXM1X3JlZyxtc2VfYmFzaXM1X3NtKSkKZGZfbXNlXzUkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8xNTwtYXMuZGF0YS5mcmFtZShjKG1zZV9iYXNpczE1X3JlZyxtc2VfYmFzaXMxNV9zbSkpCmRmX21zZV8xNSRtZXRob2Q8LWMocmVwKCJSZWdncmVzaW9uIiwxMDApLHJlcCgiU21vb3RoaW5nIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMTUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8yNTwtYXMuZGF0YS5mcmFtZShjKG1zZV9iYXNpczI1X3JlZyxtc2VfYmFzaXMyNV9zbSkpCmRmX21zZV8yNSRtZXRob2Q8LWMocmVwKCJSZWdncmVzaW9uIiwxMDApLHJlcCgiU21vb3RoaW5nIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMjUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV81X2Y8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXM1X3JlZ19mLG1zZV9iYXNpczVfc21fZikpCmRmX21zZV81X2YkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzVfZik8LWMoInZhbHVlIiwibWV0aG9kIikKZGZfbXNlXzE1X2Y8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXMxNV9yZWdfZixtc2VfYmFzaXMxNV9zbV9mKSkKZGZfbXNlXzE1X2YkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzE1X2YpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8yNV9mPC1hcy5kYXRhLmZyYW1lKGMobXNlX2Jhc2lzMjVfcmVnX2YsbXNlX2Jhc2lzMjVfc21fZikpCmRmX21zZV8yNV9mJG1ldGhvZDwtYyhyZXAoIlJlZ2dyZXNpb24iLDEwMCkscmVwKCJTbW9vdGhpbmdzIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMjVfZik8LWMoInZhbHVlIiwibWV0aG9kIikKCmBgYAoKCgpgYGB7cn0KI0dlbmVyYXIgbWF0cml6IHBhcmEgY2FkYSBiYXNlCm1hdF9iYXNpc181PC1jKCkKbWF0X2Jhc2lzXzE1PC1jKCkKbWF0X2Jhc2lzXzI1PC1jKCkKbWF0X2Jhc2lzX3JlZ181PC1jKCkKbWF0X2Jhc2lzX3JlZ18xNTwtYygpCm1hdF9iYXNpc19yZWdfMjU8LWMoKQptYXRfYmFzaXNfc21fNTwtYygpCm1hdF9iYXNpc19zbV8xNTwtYygpCm1hdF9iYXNpc19zbV8yNTwtYygpCmZvcihpIGluIDE6MTAwKXsKICBtYXRfYmFzaXNfNTwtcmJpbmQobWF0X2Jhc2lzXzUsc2FtcGxlc19zbW9vdGhfNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfMTU8LXJiaW5kKG1hdF9iYXNpc18xNSxzYW1wbGVzX3Ntb290aF8xNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfMjU8LXJiaW5kKG1hdF9iYXNpc18yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfcmVnXzU8LXJiaW5kKG1hdF9iYXNpc19yZWdfNSxzYW1wbGVzX3Ntb290aF81W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfcmVnXzE1PC1yYmluZChtYXRfYmFzaXNfcmVnXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfcmVnXzI1PC1yYmluZChtYXRfYmFzaXNfcmVnXzI1LHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfc21fNTwtcmJpbmQobWF0X2Jhc2lzX3NtXzUsc2FtcGxlc19zbW9vdGhfNVtbaV1dJHlfaGF0KQogIG1hdF9iYXNpc19zbV8xNTwtcmJpbmQobWF0X2Jhc2lzX3NtXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0keV9oYXQpCiAgbWF0X2Jhc2lzX3NtXzI1PC1yYmluZChtYXRfYmFzaXNfc21fMjUsc2FtcGxlc19zbW9vdGhfMjVbW2ldXSR5X2hhdCkKfQoKYGBgCgoKYGBge3J9CiNvYnRlbmVyIGZ1bmNpb24gbWVkaWEKbWVhbl9iYXNpc181PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc181LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiB0cnVlIGZ1bmN0aW9uIikKbWVhbl9iYXNpc18xNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfMTUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIHRydWUgZnVuY3Rpb24iKQptZWFuX2Jhc2lzXzI1PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc18yNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gdHJ1ZSBmdW5jdGlvbiIpCm1lYW5fYmFzaXNfcmVnXzU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3JlZ181LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3JlZ18xNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfcmVnXzE1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3JlZ18yNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfcmVnXzI1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3NtXzU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3NtXzUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIpCm1lYW5fYmFzaXNfc21fMTU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3NtXzE1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiKQptZWFuX2Jhc2lzX3NtXzI1PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc19zbV8yNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gU21vb3RoaW5ncyBTcGxpbmVzIikKCmBgYAoKClNlIGdyYWZpY2EgZWwgYm94cGxvdCBjb3JyZXNwb25kaWVudGUgYSBsb3MgdmFsb3JlcyBHQ1YgY29uIGNhZGEgdW5vIGRlIGxvcyB2YWxvcmVzIGRlIG7Dum1lcm8gZGUgYmFzZSAKCmBgYHtyfQpwX2JwPC1nZ3Bsb3QoZGZfZ2N2LCBhZXMoeD1iYXNpcywgeT12YWx1ZSwgZmlsbD1iYXNpcykpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCLVNwbGluZSIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCnBfYnBfZjwtZ2dwbG90KGRmX2djdl9mLCBhZXMoeD1iYXNpcywgeT12YWx1ZSwgZmlsbD1iYXNpcykpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCYXNlcyBkZSBGb3VyaWVyIikreWxhYigiIikrIHRoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKcF9icC9wX2JwX2YKYGBgCgpTZSBncmFmaWNhIGxhIGZ1bmNpw7NuIG1lZGlhIHBhcmEgbGFzIDEwMCBjcnV2YXMgZ2VuZXJhZGFzIHBhcmEgY2FkYSB1bmEgZGUgbGFzIGVsZWNjaW9uZXMgZGUgbsO6bWVybyBkZSBiYXNlcyAoNSwxNSB5IDI1KS4gVGFtYmnDqW4gc2UgcHJlc2VudGEgdW4gYm94cGxvdCBkZSBNU0UgcGFyYSBhbWJvcyBtw6l0b2RvcyBkZSBhanVzdGUgKFNtb290aGluZyBzcGxpbmVzIHkgUmVnZ3Jlc2lvbiBTcGxpbmVzKQoKIyMgZ3JhZmljYXIgY29uIDUgYmFzZXMKCmBgYHtyfQpwNTwtZ2dwbG90KG1lYW5fYmFzaXNfNSwgYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkgK2dlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfcmVnXzUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3NtXzUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJkYXJrZ3JlZW4iLCAiTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiID0gImJsdWUiKSkreWxhYigiIikrIHRoZW1lX2J3KCkKCmJwXzU8LWdncGxvdChkZl9tc2VfNSwgYWVzKHg9bWV0aG9kLCB5PXZhbHVlLCBmaWxsPW1ldGhvZCkpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCLVNwbGluZSIpKyB5bGFiKCJNU0UiKSt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmJwXzVfZjwtZ2dwbG90KGRmX21zZV81X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwNQpicF81K2JwXzVfZgoKCmBgYAojIyBncmFmaWNhciBjb24gMTUgYmFzZXMKYGBge3J9CnAxNTwtZ2dwbG90KG1lYW5fYmFzaXNfMTUsIGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpICtnZW9tX2xpbmUoKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3JlZ18xNSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfc21fMTUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJkYXJrZ3JlZW4iLCAiTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiID0gImJsdWUiKSkreWxhYigiIikrIHRoZW1lX2J3KCkKYnBfMTU8LWdncGxvdChkZl9tc2VfMTUsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQi1TcGxpbmUiKSt5bGFiKCJNU0UiKSsgdGhlbWVfYncoKSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpicF8xNV9mPC1nZ3Bsb3QoZGZfbXNlXzE1X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMTUKYnBfMTUrYnBfMTVfZgoKCmBgYAoKIyMgR3JhZmljYXIgY29uIDI1IGJhc2VzCgpgYGB7cn0KcDI1PC1nZ3Bsb3QobWVhbl9iYXNpc18yNSwgYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkgK2dlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfcmVnXzI1LGxpbmV0eXBlID0gImRvdHRlZCIsYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkrIGdlb21fbGluZShkYXRhID0gbWVhbl9iYXNpc19zbV8yNSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIk1lYW4gdHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiID0gImRhcmtncmVlbiIsICJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIgPSAiYmx1ZSIpKSt5bGFiKCIiKSt0aGVtZV9idygpCgoKYnBfMjU8LWdncGxvdChkZl9tc2VfMjUsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQi1TcGxpbmUiKSt5bGFiKCJNU0UiKSsgdGhlbWVfYncoKSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpicF8yNV9mPC1nZ3Bsb3QoZGZfbXNlXzI1X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMjUKYnBfMjUrYnBfMjVfZgoKYGBgCgoKCgoK